package KuangShen.ZhuJieHeFanShe;
/*
反射概述
Reflection(反射)是Java被视为动态语言的关键，反射机制允许程序在执行期间借助Reflection API获取任何类的内部信息，
并能直接操作任意对象的内部属性及方法
加载完类之后，在堆内存的方法区就产生了一个Class类型的对象，
一个类只有一个Class类型的对象，这个对象包含了完整的类的结构信息。
通过这个对象来看到类的结构，这个对象就像一个镜子能看到类的内部结构，所以称之为反射。
优点：动态灵活
缺点：慢于直接执行相同操作
 */

/*
反射对象Class类
1.Class本身也是一个类
2.Class对象只能由系统创建，我们只能使用。
3.一个加载的类在JVM中只有一个Class实例
4.一个Class对象对应到加载的JVM中是一个唯一的“.class”文件
5.每个示列都会记得自己是由哪个Class实例生成
6.通过Class可以完整地得到一个类中的所有被加载的结构
7.Class类是Reflection的根源，针对任何你想动态加载运行的类，唯有获取相应的Class对象
 */

/*
Class类常用方法
1.static ClassforName(String name)----------------->返回指定类名（name）的Class对象
2.Object newInstance()----------------------------->调用缺省构造函数，返回Class对象的一个实例
3.getName()---------------------------------------->返回此Class对象所表示的实体（类、接口、数组类或void）的名称
4.Class getSuperClass()---------------------------->返回当前Class对象的父类的Class对象
5.Class[] getInterfaces()-------------------------->获取当前Class对象的接口
6.ClassLoader getClassLoader()--------------------->返回该类的类加载器
7.Constructor[] getConstructors()------------------>返回一个包含某些Constructor对象的数组
8.Method getMothed(String name,Class..T )---------->返回一个Method对象，此对象的形参类型为
9.Field[] getDeclaredFields()---------------------->返回Field对象的一个数组
 */

import java.lang.annotation.ElementType;

//反射的Class对象
/*
反射机制的研究和应用：
1.在运行时判断任意一个对象所属的类
2.运行时构造任意类的对象
3.在运行时判断任意一个类所具有的成员变量和方法
4.在运行时获取泛型信息
5.在运行时调用任意一个对象的成员变量和方法
6.在运行时处理注解
7.生成动态代理
............
 */
//应用获取Class对象
public class test04 {
    public static void main(String[] args) {
        //通过反射获取类的Class对象
        //通过反射获取User类的Class对象c1
        try {
            Class c1=Class.forName("KuangShen.ZhuJieHeFanShe.User");
            Class c2=Class.forName("KuangShen.ZhuJieHeFanShe.User");
            Class c3=Class.forName("KuangShen.ZhuJieHeFanShe.User");
            //验证一个类只有一个Class对象
            System.out.println(c1);
            System.out.println(c2.hashCode());
            System.out.println(c3.hashCode());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }



    }
}
//所有类型的Class对象
/*
        Class<Object> objectClass = Object.class;--------------------类
        Class<Comparable> comparableClass = Comparable.class;--------接口
        Class<String[]> aClass = String[].class;---------------------一维数组
        Class<int[][]> aClass1 = int[][].class;----------------------二维数组
        Class<Override> overrideClass = Override.class;--------------注解
        Class<ElementType> elementTypeClass = ElementType.class;-----枚举
        Class<Integer> integerClass = Integer.class;-----------------基本数据类型
        Class<Void> voidClass = void.class;--------------------------void
        Class<Class> classClass = Class.class;-----------------------Class
 */

//实体类---->一个类里面只有一些属性就是实体类
class User{
    private String name;
    private int id;
    private int age;
    //Alt+Ins获取无参构造函数(构造方法)
    public User() {

    }
    //Alt+Ins获取构造函数（构造方法），按住Shift添加有参构造
    public User(String name, int id, int age) {
        this.name = name;
        this.id = id;
        this.age = age;
    }
    //Alt+Ins选择Getter和Setter，按住Shift添加方便程序调试
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", age=" + age +
                '}';
    }
}
